﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПараметрыОбработкиОповещения;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ТекущийПользовательСсылка = Пользователи.ТекущийПользователь();
	
	Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
		НастроитьФормуДляНеполноправногоПользователя();
	КонецЕсли;
	
	Если НетПравНаПросмотр Тогда
		Элементы.ОтчетИлиПредупреждение.ТекущаяСтраница = Элементы.НедостаточноПрав;
		Возврат;
	КонецЕсли;
	
	ТекущийПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(
		ТекущийПользовательСсылка);
	
	Если Параметры.Пользователь <> Неопределено Тогда
		
		ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Пользователь,
			"ИдентификаторПользователяИБ");
		
		УстановитьПривилегированныйРежим(Истина);
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
			ИдентификаторПользователяИБ);
		УстановитьПривилегированныйРежим(Ложь);
		
		Если ПользовательИБ = Неопределено Тогда
			Элементы.ОтчетИлиПредупреждение.ТекущаяСтраница = Элементы.ОтображатьПредупреждение;
			Возврат;
		КонецЕсли;
		
		ПользовательСсылка = Параметры.Пользователь;
		Элементы.ПользовательСсылка.Видимость = Ложь;
		Заголовок = НСтр("ru = 'Настройки пользователя'");
	Иначе
		ПользовательСсылка = Пользователи.ТекущийПользователь();
	КонецЕсли;
	
	ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка);
	
	ИспользоватьВнешнихПользователей = ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей");
	
	ИмяФормыПерсональныхНастроек = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности().ИмяФормыПерсональныхНастроек;
	
	ВыбраннаяСтраницаНастроек = Элементы.ВидыНастроек.ТекущаяСтраница.Имя;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьФормуДляНеполноправногоПользователя()
	
	Элементы.Скопировать.Видимость = Ложь;
	Элементы.СкопироватьДругим.Видимость = Ложь;
	Элементы.СкопироватьОт.Видимость = Ложь;
	Элементы.ОчиститьВыделенные.Видимость = Ложь;
	Элементы.ВнешнийВидКонтекстноеМенюСкопировать.Видимость = Ложь;
	Элементы.НастройкиОтчетовДеревоКонтекстноеМенюСкопировать.Видимость = Ложь;
	Элементы.ПрочиеНастройкиКонтекстноеМенюСкопировать.Видимость = Ложь;
	
	НетПравНаПросмотр = (ТекущийПользовательСсылка <> Параметры.Пользователь);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("ВыборПользователя") И Источник <> ИмяФормы Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОбработкиОповещения = Новый Структура("ИмяСобытия, Параметр", ИмяСобытия, Параметр);
	ПодключитьОбработчикОжидания("Подключаемый_ВыполнитьОбработкуОповещения", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если НетПравНаПросмотр Тогда
		Возврат;
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ОбновитьСписокНастроек", 0.1, Истина);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	ВыбраннаяСтраницаНастроек = ТекущаяСтраница.Имя;
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПараметрыОтбора = Новый Структура("РежимВыбора", Истина);
	
	Если ИспользоватьВнешнихПользователей Тогда
		ВыборТипаПользователей = Новый СписокЗначений;
		ВыборТипаПользователей.Добавить("ВнешниеПользователи", НСтр("ru = 'Внешние пользователи'"));
		ВыборТипаПользователей.Добавить("Пользователи",        НСтр("ru = 'Пользователи'"));
		
		ВыборТипаПользователей.ПоказатьВыборЭлемента(Новый ОписаниеОповещения(
			"ПользовательСсылкаНачалоВыбораЗавершение", ЭтотОбъект, ПараметрыОтбора));
	Иначе
		ОткрытьФорму("Справочник.Пользователи.ФормаСписка",
			ПараметрыОтбора, Элементы.ПользовательСсылка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательСсылкаНачалоВыбораЗавершение(ВыбранныйВариант, ПараметрыОтбора) Экспорт
	
	Если ВыбранныйВариант = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ВыбранныйВариант.Значение = "Пользователи" Тогда
		ОткрытьФорму("Справочник.Пользователи.ФормаСписка",
			ПараметрыОтбора, Элементы.ПользовательСсылка);
		
	ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда
		ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаСписка",
			ПараметрыОтбора, Элементы.ПользовательСсылка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкиОтчетовИВнешнийВидПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Если Не Копирование Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	СкопироватьНастройки();
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
	ТекстВопроса = НСтр("ru = 'Очистить выбранные настройки?'");
	Оповещение = Новый ОписаниеОповещения("НастройкиПередУдалениемЗавершение", ЭтотОбъект, Элемент);
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
	
КонецПроцедуры

&НаКлиенте
Процедура ДеревоНастроекВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ПользователиСлужебныйКлиент.ОткрытьОтчетИлиФорму(ТекущийЭлемент,
		ПользовательИнформационнойБазы, ТекущийПользовательИнформационнойБазы, ИмяФормыПерсональныхНастроек);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательСсылкаПриИзменении(Элемент)
	
	Элементы.КоманднаяПанель.Доступность = Не ПустаяСтрока(Элемент.ВыделенныйТекст);
	
	Если РезультатПолученияНастроек() = "НетПользователяИБ" Тогда
		ПользовательСсылка = ТекущийПользовательСсылка;
		
		ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'У выбранного пользователя ""%1"" не указан
			           |пользователь информационной базы, просмотреть его настройки невозможно.
			           |Устранить проблему можно в карточке данного пользователя.'"),
			ПользовательСсылка));
		Возврат;
	КонецЕсли;
	
	ОбновитьСписокНастроек();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Обновить(Команда)
	
	ОбновитьСписокНастроек();
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьДругим(Команда)
	
	СкопироватьНастройки();
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьВсеНастройки(Команда)
	
	КопируемыеНастройки.Очистить();
	
	КопируемыеНастройки.Добавить("НастройкиОтчетов",      НСтр("ru = 'Настройки отчетов'"));
	КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru = 'Настройки внешнего вида'"));
	КопируемыеНастройки.Добавить("ДанныеФорм",            НСтр("ru = 'Данные форм'"));
	КопируемыеНастройки.Добавить("ПерсональныеНастройки", НСтр("ru = 'Персональные настройки'"));
	КопируемыеНастройки.Добавить("Избранное",             НСтр("ru = 'Избранное'"));
	КопируемыеНастройки.Добавить("НастройкиПечати",       НСтр("ru = 'Настройки печати'"));
	КопируемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки",
		НСтр("ru = 'Настройки дополнительных отчетов и обработок'"));
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка);
	ПараметрыФормы.Вставить("ТипДействия",  "КопироватьВсе");
	
	ВыбратьПользователей(ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьНастройкиОтчетов(Команда)
	
	КопируемыеНастройки.Очистить();
	
	КопируемыеНастройки.Добавить("НастройкиОтчетов", НСтр("ru = 'Настройки отчетов'"));
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка);
	ПараметрыФормы.Вставить("ТипДействия",  "КопироватьВсе");
	ВыбратьПользователей(ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьНастройкиВнешнегоВида(Команда)
	
	КопируемыеНастройки.Очистить();
	
	КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru = 'Настройки внешнего вида'"));
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка);
	ПараметрыФормы.Вставить("ТипДействия",  "КопироватьВсе");
	ВыбратьПользователей(ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьНастройкиОтчетовИВнешнегоВида(Команда)
	
	КопируемыеНастройки.Очистить();
	КопируемыеНастройки.Добавить("НастройкиОтчетов",      НСтр("ru = 'Настройки отчетов'"));
	КопируемыеНастройки.Добавить("НастройкиВнешнегоВида", НСтр("ru = 'Настройки внешнего вида'"));
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка);
	ПараметрыФормы.Вставить("ТипДействия",  "КопироватьВсе");
	ВыбратьПользователей(ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура Очистить(Команда)
	
	ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек();
	
	Если ДеревоНастроек.ВыделенныеСтроки.Количество() = 0 Тогда
		
		ПоказатьПредупреждение(,НСтр("ru = 'Выберите настройки, которые требуется удалить.'"));
		Возврат;
		
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьЗавершение", ЭтотОбъект, ДеревоНастроек);
	ТекстВопроса = НСтр("ru = 'Очистить выделенные настройки?'");
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиВыбраннымПользователям(Команда)
	
	ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек();
	ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите настройки, которые требуется удалить.'"));
		Возврат;
		
	КонецЕсли;
	
	ТекстВопроса =
		НСтр("ru = 'Очистить выделенные настройки?
		           |Откроется окно выбора пользователей, которым необходимо очистить настройки.'");
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиВыбраннымПользователямЗавершение", ЭтотОбъект);
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьВсеНастройки(Команда)
	
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Очистить все настройки у пользователя ""%1""?'"), Строка(ПользовательСсылка));
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить("Очистить", НСтр("ru = 'Очистить'"));
	КнопкиВопроса.Добавить("Отмена",   НСтр("ru = 'Отмена'"));
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьВсеНастройкиЗавершение", ЭтотОбъект);
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУстаревшиеНастройки(Команда)
	
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Очистить устаревшие настройки у пользователя ""%1""?'"), Строка(ПользовательСсылка));
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить("Очистить", НСтр("ru = 'Очистить'"));
	КнопкиВопроса.Добавить("Отмена",   НСтр("ru = 'Отмена'"));
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьУстаревшиеНастройкиЗавершение", ЭтотОбъект);
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиОтчетовИВнешнегоВида(Команда)
	
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Очистить все настройки отчетов и внешнего вида у пользователя ""%1""?'"),
		Строка(ПользовательСсылка));
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить("Очистить", НСтр("ru = 'Очистить'"));
	КнопкиВопроса.Добавить("Отмена",   НСтр("ru = 'Отмена'"));
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиОтчетовИВнешнегоВидаЗавершение", ЭтотОбъект);
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьНастройку(Команда)
	
	ПользователиСлужебныйКлиент.ОткрытьОтчетИлиФорму(ТекущийЭлемент,
		ПользовательИнформационнойБазы, ТекущийПользовательИнформационнойБазы, ИмяФормыПерсональныхНастроек);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиВсехПользователей(Команда)
	
	ТекстВопроса =
		НСтр("ru = 'Сейчас будут очищены все настройки всех пользователей.
		           |Продолжить?'");
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить("ОчиститьВсе", НСтр("ru = 'Очистить все'"));
	КнопкиВопроса.Добавить("Отмена",      НСтр("ru = 'Отмена'"));
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиВсехПользователейЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУстаревшиеНастройкиВсехПользователей(Команда)
	
	ТекстВопроса =
		НСтр("ru = 'Сейчас будут очищены устаревшие настройки всех пользователей.
		           |Продолжить?'");
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить("ОчиститьВсе", НСтр("ru = 'Очистить все'"));
	КнопкиВопроса.Добавить("Отмена",      НСтр("ru = 'Отмена'"));
	
	Оповещение = Новый ОписаниеОповещения("ОчиститьУстаревшиеНастройкиВсехПользователейЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьОт(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь",       ПользовательСсылка);
	ПараметрыФормы.Вставить("РежимОткрытияФормы", "СкопироватьОт");
	
	ОткрытьФорму("Обработка.НастройкиПользователей.Форма.КопированиеНастроекПользователей", ПараметрыФормы);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для вывода списков настроек.

&НаКлиенте
Процедура ОбновитьСписокНастроек()
	
	Элементы.БыстрыйПоиск.Доступность = Ложь;
	Элементы.КоманднаяПанель.Доступность = Ложь;
	Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация;
	
	Результат = ОбновлениеСпискаНастроек();
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбновитьСписокНастроекЗавершение", ЭтотОбъект);
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция ОбновлениеСпискаНастроек()
	
	Если РезультатВыполнения <> Неопределено
	   И ЗначениеЗаполнено(РезультатВыполнения.ИдентификаторЗадания) Тогда
		ДлительныеОперации.ОтменитьВыполнениеЗадания(РезультатВыполнения.ИдентификаторЗадания);
	КонецЕсли;
	
	ПараметрыДлительнойОперации = ПараметрыДлительнойОперации();
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.ОжидатьЗавершение = 0; // Запускать сразу.
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление настроек пользователей'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне("ПользователиСлужебный.ЗаполнитьСпискиНастроек",
		ПараметрыДлительнойОперации, ПараметрыВыполнения);
	
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура ОбновитьСписокНастроекЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус = "Выполнено" Тогда
		ЗаполнитьНастройки();
		
		Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаНастройки;
		Элементы.БыстрыйПоиск.Доступность = Истина;
		Элементы.КоманднаяПанель.Доступность = Истина;
		
		ПодключитьОбработчикОжидания("Подключаемый_РазвернутьДеревоЗначений", 0.1, Истина);
	ИначеЕсли Результат.Статус = "Ошибка" Тогда
		Элементы.СтраницыДлительнаяОперация.ТекущаяСтраница = Элементы.СтраницаНастройки;
		ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНастройки()
	
	Результат = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
	
	ЗначениеВРеквизитФормы(Результат.НастройкиОтчетовДерево, "НастройкиОтчетов");
	ЗначениеВРеквизитФормы(Результат.ПользовательскиеВариантыОтчетов, "ТаблицаПользовательскихВариантовОтчетов");
	ЗначениеВРеквизитФормы(Результат.НастройкиВнешнегоВида, "ВнешнийВид");
	ЗначениеВРеквизитФормы(Результат.ПрочиеНастройкиДерево, "ПрочиеНастройки");
	
	РассчитатьКоличествоНастроек();
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для расчета количества настроек.

&НаСервере
Процедура РассчитатьКоличествоНастроек()
	
	СписокНастроек = НастройкиОтчетов.ПолучитьЭлементы();
	КоличествоНастроек = КоличествоНастроекВДереве(СписокНастроек);
	
	Если КоличествоНастроек <> 0 Тогда
		Элементы.НастройкиОтчетовСтраница.Заголовок =
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Настройки отчетов (%1)'"), КоличествоНастроек);
	Иначе
		Элементы.НастройкиОтчетовСтраница.Заголовок = НСтр("ru = 'Настройки отчетов'");
	КонецЕсли;
	
	СписокНастроек = ВнешнийВид.ПолучитьЭлементы();
	КоличествоНастроек = КоличествоНастроекВДереве(СписокНастроек);
	
	Если КоличествоНастроек <> 0 Тогда
		Элементы.ВнешнийВидСтраница.Заголовок =
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Внешний вид (%1)'"), КоличествоНастроек);
	Иначе
		Элементы.ВнешнийВидСтраница.Заголовок = НСтр("ru = 'Внешний вид'");
	КонецЕсли;
	
	СписокНастроек = ПрочиеНастройки.ПолучитьЭлементы();
	КоличествоНастроек = КоличествоНастроекВДереве(СписокНастроек);
	
	Если КоличествоНастроек <> 0 Тогда
		Элементы.ПрочиеНастройкиСтраница.Заголовок =
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Прочие настройки (%1)'"), КоличествоНастроек);
	Иначе
		Элементы.ПрочиеНастройкиСтраница.Заголовок = НСтр("ru = 'Прочие настройки'");
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция КоличествоНастроекВДереве(СписокНастроек)
	
	КоличествоНастроек = 0;
	Для Каждого Настройка Из СписокНастроек Цикл
		
		КоличествоПодчиненныхНастроек = Настройка.ПолучитьЭлементы().Количество();
		Если КоличествоПодчиненныхНастроек = 0 Тогда
			КоличествоНастроек = КоличествоНастроек + 1;
		Иначе
			КоличествоНастроек = КоличествоНастроек + КоличествоПодчиненныхНастроек;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат КоличествоНастроек;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции, отвечающие за копирование, удаление и очистку настроек.

&НаСервере
Процедура СкопироватьНаСервере(ПользователиПриемник, ЛичныхНастроекОтчетов, Отчет)
	
	Результат = ВыделенныеНастройки();
	ТаблицаВыделенныхВариантовОтчетов = Новый ТаблицаЗначений;
	ТаблицаВыделенныхВариантовОтчетов.Колонки.Добавить("Представление");
	ТаблицаВыделенныхВариантовОтчетов.Колонки.Добавить("СтандартнаяОбработка");
	
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		
		Для Каждого Настройка Из Результат.МассивНастроек Цикл
			
			Для Каждого Элемент Из Настройка Цикл
				
				Если Элемент.Пометка Тогда
					ЛичныхНастроекОтчетов = ЛичныхНастроекОтчетов + 1;
					КлючОтчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элемент.Значение, "/");
					
					ПараметрОтбора = Новый Структура("КлючОбъекта", КлючОтчета[0]);
					МассивСтрок = ТаблицаПользовательскихВариантовОтчетов.НайтиСтроки(ПараметрОтбора);
					
					Если МассивСтрок.Количество() <> 0 Тогда
						СтрокаТаблицы = ТаблицаВыделенныхВариантовОтчетов.Добавить();
						СтрокаТаблицы.Представление = МассивСтрок[0].Представление;
						СтрокаТаблицы.СтандартнаяОбработка = Истина;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЦикла;
		
		НеСкопированныеНастройкиОтчетов = Новый ТаблицаЗначений;
		НеСкопированныеНастройкиОтчетов.Колонки.Добавить("Пользователь");
		НеСкопированныеНастройкиОтчетов.Колонки.Добавить("СписокОтчетов", Новый ОписаниеТипов("СписокЗначений"));
		
		Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки(
			ХранилищеПользовательскихНастроекОтчетов,
			ПользовательИнформационнойБазы,
			ПользователиПриемник,
			Результат.МассивНастроек,
			НеСкопированныеНастройкиОтчетов);
		
		// Копирование вариантов отчетов.
		Обработки.НастройкиПользователей.СкопироватьВариантыОтчетов(Результат.МассивВариантовОтчетов,
			ТаблицаПользовательскихВариантовОтчетов, ПользовательИнформационнойБазы, ПользователиПриемник);
			
		Если НеСкопированныеНастройкиОтчетов.Количество() <> 0
		 Или ТаблицаПользовательскихВариантовОтчетов.Количество() <> 0 Тогда
			
			Отчет = Обработки.НастройкиПользователей.ФормированиеОтчетаОКопировании(
				НеСкопированныеНастройкиОтчетов, ТаблицаВыделенныхВариантовОтчетов);
		КонецЕсли;
		
	ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда
		Обработки.НастройкиПользователей.СкопироватьНастройкиВнешнегоВида(ПользовательИнформационнойБазы,
			ПользователиПриемник, Результат.МассивНастроек);
	Иначе
		
		Если Результат.МассивПерсональныхНастроек.Количество() <> 0 Тогда
			Обработки.НастройкиПользователей.СкопироватьНастройкиОтчетовИПерсональныеНастройки(
				ХранилищеОбщихНастроек,
				ПользовательИнформационнойБазы,
				ПользователиПриемник,
				Результат.МассивПерсональныхНастроек);
		КонецЕсли;
			
		Если Результат.МассивПользовательскихНастроек.Количество() <> 0 Тогда
			
			Для Каждого ПрочиеПользовательскиеНастройки Из Результат.МассивПользовательскихНастроек Цикл
				Для Каждого ПользовательПриемник Из ПользователиПриемник Цикл
					
					СведенияОПользователе = Новый Структура;
					СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательПриемник);
					СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы",
						Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательПриемник));
					
					ПользователиСлужебный.ПриСохраненииПрочихНастроекПользователя(
						СведенияОПользователе, ПрочиеПользовательскиеНастройки);
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
		
		Обработки.НастройкиПользователей.СкопироватьНастройкиВнешнегоВида(
			ПользовательИнформационнойБазы, ПользователиПриемник, Результат.МассивНастроек);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура СкопироватьВсеНастройкиНаСервере(Пользователь, ПользователиПриемник, МассивНастроек, Отчет)
	
	НеСкопированныеНастройкиОтчетов = Новый ТаблицаЗначений;
	НеСкопированныеНастройкиОтчетов.Колонки.Добавить("Пользователь");
	НеСкопированныеНастройкиОтчетов.Колонки.Добавить("СписокОтчетов", Новый ОписаниеТипов("СписокЗначений"));
	
	Обработки.НастройкиПользователей.КопированиеНастроекПользователей(
		ПользовательСсылка, ПользователиПриемник, МассивНастроек, НеСкопированныеНастройкиОтчетов);
		
	Если НеСкопированныеНастройкиОтчетов.Количество() <> 0
	 Или ТаблицаПользовательскихВариантовОтчетов.Количество() <> 0 Тогда
		
		Отчет = Обработки.НастройкиПользователей.ФормированиеОтчетаОКопировании(
			НеСкопированныеНастройкиОтчетов, ТаблицаПользовательскихВариантовОтчетов);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОчиститьНаСервере(Пользователи = Неопределено, ВыбраннымПользователям = Ложь)
	
	Результат = ВыделенныеНастройки();
	НазваниеХранилища = ХранилищеНастроекДляВыбраннойСтраницы();
	
	Если ВыбраннымПользователям Тогда
		
		Обработки.НастройкиПользователей.УдалитьНастройкиВыбраннымПользователям(Пользователи,
			Результат.МассивНастроек, НазваниеХранилища);
		
		Если Результат.МассивПерсональныхНастроек.Количество() <> 0 Тогда
			Обработки.НастройкиПользователей.УдалитьНастройкиВыбраннымПользователям(Пользователи,
				Результат.МассивПерсональныхНастроек, "ХранилищеОбщихНастроек");
		КонецЕсли;
		
		Возврат;
	КонецЕсли;
	
	// Очистка настроек
	СведенияОПользователе = Новый Структура;
	СведенияОПользователе.Вставить("ИмяПользователяИнформационнойБазы", ПользовательИнформационнойБазы);
	СведенияОПользователе.Вставить("ПользовательСсылка", ПользовательСсылка);
	
	Обработки.НастройкиПользователей.УдалитьВыбранныеНастройки(СведенияОПользователе,
		Результат.МассивНастроек, НазваниеХранилища);
	
	Если Результат.МассивПерсональныхНастроек.Количество() <> 0 Тогда
		Обработки.НастройкиПользователей.УдалитьВыбранныеНастройки(СведенияОПользователе,
			Результат.МассивПерсональныхНастроек, "ХранилищеОбщихНастроек");
	КонецЕсли;
	
	Если Результат.МассивПользовательскихНастроек.Количество() <> 0 Тогда
		
		Для Каждого ПрочиеПользовательскиеНастройки Из Результат.МассивПользовательскихНастроек Цикл
			ПользователиСлужебный.ПриУдаленииПрочихНастроекПользователя(
				СведенияОПользователе, ПрочиеПользовательскиеНастройки);
		КонецЦикла;
	КонецЕсли;
	
	// Очистка вариантов отчетов
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		
		Обработки.НастройкиПользователей.УдалитьВариантыОтчетов(Результат.МассивВариантовОтчетов,
			ТаблицаПользовательскихВариантовОтчетов, ПользовательИнформационнойБазы);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки, ОчиститьВсе = Ложь)
	
	МассивПользователей = Новый Массив;
	МассивПользователей.Добавить(ПользовательСсылка);
	
	Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(ОчищаемыеНастройки,
		МассивПользователей, ТаблицаПользовательскихВариантовОтчетов, ОчиститьВсе);
	
КонецПроцедуры

&НаСервере
Процедура ОчиститьУстаревшиеНастройкиНаСервере()
	
	МассивПользователей = Новый Массив;
	МассивПользователей.Добавить(ПользовательСсылка);
	
	Обработки.НастройкиПользователей.УдалитьУстаревшиеНастройкиПользователей(МассивПользователей);
	
КонецПроцедуры

&НаСервере
Процедура ОчиститьНастройкиВсехПользователейНаСервере()
	
	ОчищаемыеНастройки = Новый Массив;
	ОчищаемыеНастройки.Добавить("НастройкиОтчетов");
	ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида");
	ОчищаемыеНастройки.Добавить("ПерсональныеНастройки");
	ОчищаемыеНастройки.Добавить("ДанныеФорм");
	ОчищаемыеНастройки.Добавить("Избранное");
	ОчищаемыеНастройки.Добавить("НастройкиПечати");
	
	МассивПользователей = Новый Массив;
	ТаблицаПользователей = Новый ТаблицаЗначений;
	ТаблицаПользователей.Колонки.Добавить("Пользователь");
	ТаблицаПользователей.Колонки.Добавить("Подразделение");
	ТаблицаПользователей.Колонки.Добавить("ФизическоеЛицо");
	
	ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования("",
		ТаблицаПользователей, Ложь, Истина);
	
	Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
		МассивПользователей.Добавить(СтрокаТаблицы.Пользователь);
	КонецЦикла;
	
	Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(ОчищаемыеНастройки, МассивПользователей,, Истина);
	
КонецПроцедуры

&НаСервере
Процедура ОчиститьУстаревшиеНастройкиВсехПользователейНаСервере()
	
	Обработки.НастройкиПользователей.УдалитьУстаревшиеНастройкиПользователей(Неопределено);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки)
	
	Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
		
		Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
			УдалитьСтрокуНастроек(НастройкиОтчетов, ВыделеннаяСтрока);
			
		ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда
			УдалитьСтрокуНастроек(ВнешнийВид, ВыделеннаяСтрока);
		Иначе
			УдалитьСтрокуНастроек(ПрочиеНастройки, ВыделеннаяСтрока);
		КонецЕсли;
		
	КонецЦикла;
	
	РассчитатьКоличествоНастроек();
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьЗавершение(Ответ, ДеревоНастроек) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
	ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки;
	КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек);
	
	ОчиститьНаСервере();
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	
	Если КоличествоНастроек = 1 Тогда
		
		НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка;
		Если СтрДлина(НазваниеНастройки) > 24 Тогда
			НазваниеНастройки = Лев(НазваниеНастройки, 24) + "...";
		КонецЕсли;
		
	КонецЕсли;
	
	УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки);
	
	ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.

&НаКлиенте
Процедура Подключаемый_ВыполнитьОбработкуОповещения()
	
	ИмяСобытия = ПараметрыОбработкиОповещения.ИмяСобытия;
	Параметр   = ПараметрыОбработкиОповещения.Параметр;
	
	Если ВРег(ИмяСобытия) = ВРег("СкопированыНастройки") Тогда
		ОбновитьСписокНастроек();
		ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
		Возврат;
	КонецЕсли;
	
	Если ВРег(ИмяСобытия) <> ВРег("ВыборПользователя") Тогда
		Возврат;
	КонецЕсли;
	
	ПользователиПриемник = Параметр.ПользователиПриемник;
	КоличествоПользователей = ПользователиПриемник.Количество();
	
	ПояснениеКомуСкопированыНастройки = ПользователиСлужебныйКлиент.ПояснениеПользователи(
		КоличествоПользователей, ПользователиПриемник[0]);
	
	ТекстОповещения     = НСтр("ru = 'Копирование настроек'");
	КартинкаОповещения  = БиблиотекаКартинок.Информация32;
	
	Если Параметр.КопироватьВсе Тогда
		
		МассивНастроек = Новый Массив;
		ИменаНастроек = "";
		Для Каждого Настройка Из КопируемыеНастройки Цикл 
			
			ИменаНастроек = ИменаНастроек + НРег(Настройка.Представление) + ", ";
			МассивНастроек.Добавить(Настройка.Значение);
			
		КонецЦикла;
		
		ИменаНастроек = Лев(ИменаНастроек, СтрДлина(ИменаНастроек)-2);
		
		Если МассивНастроек.Количество() = 7 Тогда
			ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Скопированы все настройки %1'"), ПояснениеКомуСкопированыНастройки);
		Иначе
			ПояснениеОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 скопированы %2'"), ИменаНастроек, ПояснениеКомуСкопированыНастройки);
		КонецЕсли;
		
		Отчет = Неопределено;
		СкопироватьВсеНастройкиНаСервере(ПользовательИнформационнойБазы,
			ПользователиПриемник, МассивНастроек, Отчет);
		
		Если Отчет <> Неопределено Тогда
			ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'");
			
			КнопкиВопроса = Новый СписокЗначений;
			КнопкиВопроса.Добавить("Ок", НСтр("ru = 'ОК'"));
			КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru = 'Показать отчет'"));
			
			Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет);
			ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение);
			
			Возврат;
		КонецЕсли;
		
		ПоказатьОповещениеПользователя(ТекстОповещения, , ПояснениеОповещения, КартинкаОповещения);
		Возврат;
	КонецЕсли;
	
	Если Параметр.ОчисткаНастроек Тогда
		
		ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек();
		КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек);
		
		ОчиститьНаСервере(ПользователиПриемник, Истина);
		
		Если КоличествоНастроек = 1 Тогда
			
			НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка;
			Если СтрДлина(НазваниеНастройки) > 24 Тогда
				НазваниеНастройки = Лев(НазваниеНастройки, 24) + "...";
			КонецЕсли;
			
		КонецЕсли;
		
		КоличествоПользователей = Параметр.ПользователиПриемник.Количество();
		ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки, КоличествоПользователей);
		Возврат;
	КонецЕсли;
	
	ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек();
	КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек);
	
	ЛичныхНастроекОтчетов = 0;
	Отчет = Неопределено;
	СкопироватьНаСервере(ПользователиПриемник, ЛичныхНастроекОтчетов, Отчет);
	
	Если Отчет <> Неопределено Тогда
		ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'");
		КнопкиВопроса = Новый СписокЗначений;
		КнопкиВопроса.Добавить("Ок", НСтр("ru = 'ОК'"));
		КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru = 'Показать отчет'"));
		
		Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет);
		ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение);
		Возврат;
	Иначе
		
		Если КоличествоНастроек = 1 Тогда
			ПредставлениеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка;
		КонецЕсли;
		
		ПояснениеОповещения = ПользователиСлужебныйКлиент.ФормированиеПоясненияПриКопировании(
			ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки);
		
		ПоказатьОповещениеПользователя(ТекстОповещения, , ПояснениеОповещения, КартинкаОповещения);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьПользователей(ПараметрыВыбора)
	
	ПараметрыВыбора.Вставить("Источник", ИмяФормы);
	ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыВыбора);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиВыбраннымПользователямЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка);
	ПараметрыФормы.Вставить("ТипДействия",  "Очистка");
	ВыбратьПользователей(ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиВсехПользователейЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = "Отмена" Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьНастройкиВсехПользователейНаСервере();
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	
	ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), ,
		НСтр("ru = 'Очищены все настройки всех пользователя'"), БиблиотекаКартинок.Информация32);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУстаревшиеНастройкиВсехПользователейЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = "Отмена" Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьУстаревшиеНастройкиВсехПользователейНаСервере();
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	
	ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), ,
		НСтр("ru = 'Очищены устаревшие настройки всех пользователя'"), БиблиотекаКартинок.Информация32);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьВсеНастройкиЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = "Отмена" Тогда
		Возврат;
	КонецЕсли;
	
	ОчищаемыеНастройки = Новый Массив;
	ОчищаемыеНастройки.Добавить("НастройкиОтчетов");
	ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида");
	ОчищаемыеНастройки.Добавить("ДанныеФорм");
	ОчищаемыеНастройки.Добавить("ПерсональныеНастройки");
	ОчищаемыеНастройки.Добавить("Избранное");
	ОчищаемыеНастройки.Добавить("НастройкиПечати");
	ОчищаемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки");
	
	ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки, Истина);
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	ОбновитьСписокНастроек();
	
	ТекстПояснения = НСтр("ru = 'Очищены все настройки пользователя ""%1""'");
	ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка);
	ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУстаревшиеНастройкиЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = "Отмена" Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьУстаревшиеНастройкиНаСервере();
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	ОбновитьСписокНастроек();
	
	ТекстПояснения = НСтр("ru = 'Очищены устаревшие настройки пользователя ""%1""'");
	ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка);
	ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьНастройкиОтчетовИВнешнегоВидаЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = "Отмена" Тогда
		Возврат;
	КонецЕсли;
	
	ОчищаемыеНастройки = Новый Массив;
	ОчищаемыеНастройки.Добавить("НастройкиОтчетов");
	ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида");
	ОчищаемыеНастройки.Добавить("ДанныеФорм");
	
	ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки);
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	
	ТекстПояснения = НСтр("ru = 'Очищены все настройки отчетов и внешнего вида у пользователя ""%1""'");
	ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, Строка(ПользовательСсылка));
	ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32);
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПередУдалениемЗавершение(Ответ, Элемент) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьНаСервере();
	ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	
	ВыделенныеСтроки = Элемент.ВыделенныеСтроки;
	КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(Элемент);
	
	Если КоличествоНастроек = 1 Тогда
		
		ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек();
		НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка;
		
		Если СтрДлина(НазваниеНастройки) > 24 Тогда
			НазваниеНастройки = Лев(НазваниеНастройки, 24) + "...";
		КонецЕсли;
		
	КонецЕсли;
	
	УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки);
	
	ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещенияПоказатьВопрос(Ответ, Отчет) Экспорт
	
	Если Ответ = "Ок" Тогда
		Возврат;
	Иначе
		Отчет.ОтображатьГруппировки = Истина;
		Отчет.ОтображатьСетку = Ложь;
		Отчет.ОтображатьЗаголовки = Ложь;
		Отчет.Показать();
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РазвернутьДеревоЗначений()
	
	Строки = НастройкиОтчетов.ПолучитьЭлементы();
	Для Каждого Строка Из Строки Цикл
		Элементы.НастройкиОтчетовДерево.Развернуть(Строка.ПолучитьИдентификатор(), Истина);
	КонецЦикла;
	
	Строки = ВнешнийВид.ПолучитьЭлементы();
	Для Каждого Строка Из Строки Цикл
		Элементы.ВнешнийВид.Развернуть(Строка.ПолучитьИдентификатор(), Истина);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Функция ТаблицаФормыВыбраннойСтраницыНастроек()
	
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		Возврат Элементы.НастройкиОтчетовДерево;
	ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда
		Возврат Элементы.ВнешнийВид;
	Иначе
		Возврат Элементы.ПрочиеНастройки;
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Функция КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек)
	
	ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки;
	// Переносим массив выделенных строк в список значений, чтобы отсортировать выбранные строки.
	СписокВыделенныхСтрок = Новый СписокЗначений;
	Для Каждого Элемент Из ВыделенныеСтроки Цикл
		СписокВыделенныхСтрок.Добавить(Элемент);
	КонецЦикла;
	
	СписокВыделенныхСтрок.СортироватьПоЗначению();
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		ТекущееДеревоЗначений = НастройкиОтчетов;
	ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда
		ТекущееДеревоЗначений = ВнешнийВид;
	Иначе
		ТекущееДеревоЗначений = ПрочиеНастройки;
	КонецЕсли;
	
	КоличествоНастроек = 0;
	Для Каждого ВыделеннаяСтрока Из СписокВыделенныхСтрок Цикл
		ЭлементДерева = ТекущееДеревоЗначений.НайтиПоИдентификатору(ВыделеннаяСтрока.Значение);
		КоличествоПодчиненныхЭлементов = ЭлементДерева.ПолучитьЭлементы().Количество();
		РодительЭлемента = ЭлементДерева.ПолучитьРодителя();
		
		Если КоличествоПодчиненныхЭлементов <> 0 Тогда
			КоличествоНастроек = КоличествоНастроек + КоличествоПодчиненныхЭлементов;
			ЭлементВерхнегоУровня = ЭлементДерева;
		ИначеЕсли КоличествоПодчиненныхЭлементов = 0
			И РодительЭлемента = Неопределено Тогда
			КоличествоНастроек = КоличествоНастроек + 1;
		Иначе
			
			Если РодительЭлемента <> ЭлементВерхнегоУровня Тогда
				КоличествоНастроек = КоличествоНастроек + 1;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат КоличествоНастроек;
КонецФункции

&НаКлиенте
Процедура УдалитьСтрокуНастроек(ДеревоНастроек, ВыделеннаяСтрока)
	
	ЭлементНастроек = ДеревоНастроек.НайтиПоИдентификатору(ВыделеннаяСтрока);
	Если ЭлементНастроек = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	РодительЭлементаНастроек = ЭлементНастроек.ПолучитьРодителя();
	Если РодительЭлементаНастроек <> Неопределено Тогда
		
		КоличествоПодчиненныхСтрок = РодительЭлементаНастроек.ПолучитьЭлементы().Количество();
		Если КоличествоПодчиненныхСтрок = 1 Тогда
			
			Если РодительЭлементаНастроек.Тип <> "ВариантЛичный" Тогда
				ДеревоНастроек.ПолучитьЭлементы().Удалить(РодительЭлементаНастроек);
			КонецЕсли;
			
		Иначе
			РодительЭлементаНастроек.ПолучитьЭлементы().Удалить(ЭлементНастроек);
		КонецЕсли;
		
	Иначе
		ДеревоНастроек.ПолучитьЭлементы().Удалить(ЭлементНастроек);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки = Неопределено, КоличествоПользователей = Неопределено)
	
	ПрописьПредмета = Формат(КоличествоНастроек, "ЧДЦ=0") + " "
		+ ПользователиСлужебныйКлиентСервер.ПредметЦелогоЧисла(КоличествоНастроек,
			"", НСтр("ru = 'настройка,настройки,настроек,,,,,,0'"));
	
	Если КоличествоНастроек = 1
	   И КоличествоПользователей = Неопределено Тогда
		
		ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '""%1"" очищена пользователю ""%2""'"), НазваниеНастройки, Строка(ПользовательСсылка));
		
	ИначеЕсли КоличествоПользователей = Неопределено Тогда
		ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Очищено %1 пользователю ""%2""'"), ПрописьПредмета, Строка(ПользовательСсылка));
	КонецЕсли;
	
	ПояснениеКомуОчищатьНастройки = ПользователиСлужебныйКлиент.ПояснениеПользователи(
		КоличествоПользователей, Строка(ПользовательСсылка));
	
	Если КоличествоПользователей <> Неопределено Тогда
		
		Если КоличествоНастроек = 1 Тогда
			ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '""%1"" очищена %2'"), НазваниеНастройки, ПояснениеКомуОчищатьНастройки);
		Иначе
			ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Очищено %1 %2'"), ПрописьПредмета, ПояснениеКомуОчищатьНастройки);
		КонецЕсли;
		
	КонецЕсли;
	
	ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"),
		, ТекстПояснения, БиблиотекаКартинок.Информация32);
	
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьНастройки()
	
	ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек();
	Если ДеревоНастроек.ВыделенныеСтроки.Количество() = 0 Тогда
		ПоказатьПредупреждение(,
			НСтр("ru = 'Выберите настройки, которые требуется скопировать.'"));
		Возврат;
	ИначеЕсли ДеревоНастроек.ВыделенныеСтроки.Количество() = 1 Тогда
		
		Если ДеревоНастроек.ТекущиеДанные.Тип = "ВариантЛичный" Тогда
			ПоказатьПредупреждение(,
				НСтр("ru = 'Невозможно скопировать личный вариант отчета.
			               |Для того чтобы личный вариант отчета стал доступен другим пользователям, необходимо
			               |его пересохранить со снятой пометкой ""Только для автора"".'"));
			Возврат;
		ИначеЕсли ДеревоНастроек.ТекущиеДанные.Тип = "НастройкаЛичная" Тогда
			ПоказатьПредупреждение(,
				НСтр("ru = 'Невозможно скопировать настройку личного варианта отчета.
			               |Копирование настроек личных вариантов отчетов не предусмотрено.'"));
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователь", ПользовательСсылка);
	ПараметрыФормы.Вставить("ТипДействия",  "");
	ВыбратьПользователей(ПараметрыФормы);
	
КонецПроцедуры

&НаСервере
Функция РезультатПолученияНастроек()
	
	Если Не ЗначениеЗаполнено(ПользовательСсылка) Тогда
		ПользовательСсылка = Справочники.Пользователи.ПустаяСсылка();
		ПользовательИнформационнойБазы = Неопределено;
	Иначе
		ПользовательИнформационнойБазы = Обработки.НастройкиПользователей.ИмяПользователяИБ(
			ПользовательСсылка);
	КонецЕсли;
	
	Если ПользовательИнформационнойБазы = Неопределено Тогда
		Возврат "НетПользователяИБ";
	КонецЕсли;
	
	Возврат "Успешно";
	
КонецФункции

&НаСервере
Функция ДеревоНастроекДляВыбраннойСтраницы()
	
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		Возврат НастройкиОтчетов;
	ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда
		Возврат ВнешнийВид;
	Иначе
		Возврат ПрочиеНастройки;
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция ХранилищеНастроекДляВыбраннойСтраницы()
	
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		Возврат "ХранилищеПользовательскихНастроекОтчетов";
	ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница"
		Или ВыбраннаяСтраницаНастроек = "ПрочиеНастройкиСтраница" Тогда
		Возврат "ХранилищеСистемныхНастроек";
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция ВыделенныеЭлементыНастроек()
	
	Если ВыбраннаяСтраницаНастроек = "НастройкиОтчетовСтраница" Тогда
		Возврат Элементы.НастройкиОтчетовДерево.ВыделенныеСтроки;
	ИначеЕсли ВыбраннаяСтраницаНастроек = "ВнешнийВидСтраница" Тогда
		Возврат Элементы.ВнешнийВид.ВыделенныеСтроки;
	Иначе
		Возврат Элементы.ПрочиеНастройки.ВыделенныеСтроки;
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция ВыделенныеНастройки()
	
	ДеревоНастроек = ДеревоНастроекДляВыбраннойСтраницы();
	МассивНастроек = Новый Массив;
	МассивПерсональныхНастроек = Новый Массив;
	МассивВариантовОтчетов = Новый Массив;
	МассивПользовательскихНастроек = Новый Массив;
	ТекущийВариантОтчета = Неопределено;
	
	ВыделенныеЭлементы = ВыделенныеЭлементыНастроек();
	
	Для Каждого ВыделенныйЭлемент Из ВыделенныеЭлементы Цикл
		ВыделеннаяНастройка = ДеревоНастроек.НайтиПоИдентификатору(ВыделенныйЭлемент);
		
		// Заполнение массива персональных настроек.
		Если ВыделеннаяНастройка.Тип = "ПерсональныеНастройки" Тогда
			МассивПерсональныхНастроек.Добавить(ВыделеннаяНастройка.Ключи);
			Продолжить;
		КонецЕсли;
		
		// Заполнение массива прочих пользовательских настроек.
		Если ВыделеннаяНастройка.Тип = "ПрочаяПользовательскаяНастройка" Тогда
			ПрочиеПользовательскиеНастройки = Новый Структура;
			ПрочиеПользовательскиеНастройки.Вставить("ИдентификаторНастройки", ВыделеннаяНастройка.ТипСтроки);
			ПрочиеПользовательскиеНастройки.Вставить("ЗначениеНастройки",      ВыделеннаяНастройка.Ключи);
			МассивПользовательскихНастроек.Добавить(ПрочиеПользовательскиеНастройки);
			Продолжить;
		КонецЕсли;
		
		// Для личных настроек проставляем в списке ключей пометку об этом.
		Если ВыделеннаяНастройка.Тип = "ВариантЛичный" Тогда
			
			Для Каждого Элемент Из ВыделеннаяНастройка.Ключи Цикл
				Элемент.Пометка = Истина;
			КонецЦикла;
			ТекущийВариантОтчета = ВыделеннаяНастройка.Ключи.Скопировать();
			// Заполнение массива личных вариантов отчетов.
			МассивВариантовОтчетов.Добавить(ВыделеннаяНастройка.Ключи);
			
		ИначеЕсли ВыделеннаяНастройка.Тип = "СтандартныйВариантЛичный" Тогда
			МассивВариантовОтчетов.Добавить(ВыделеннаяНастройка.Ключи);
		КонецЕсли;
		
		Если ВыделеннаяНастройка.Тип = "НастройкаЛичная" Тогда
			
			Если ТекущийВариантОтчета <> Неопределено
			   И ТекущийВариантОтчета.НайтиПоЗначению(ВыделеннаяНастройка.Ключи[0].Значение) <> Неопределено Тогда
				
				Продолжить;
			Иначе
				ВыделеннаяНастройка.Ключи[0].Пометка = Истина;
				МассивНастроек.Добавить(ВыделеннаяНастройка.Ключи);
				Продолжить;
			КонецЕсли;
			
		КонецЕсли;
		
		МассивНастроек.Добавить(ВыделеннаяНастройка.Ключи);
		
	КонецЦикла;
	
	Результат = Новый Структура;
	Результат.Вставить("МассивНастроек", МассивНастроек);
	Результат.Вставить("МассивПерсональныхНастроек", МассивПерсональныхНастроек);
	Результат.Вставить("МассивВариантовОтчетов", МассивВариантовОтчетов);
	Результат.Вставить("МассивПользовательскихНастроек", МассивПользовательскихНастроек);
	
	Возврат Результат;
КонецФункции

&НаСервере
Функция ПараметрыДлительнойОперации()
	
	ПараметрыДлительнойОперации = Новый Структура;
	ПараметрыДлительнойОперации.Вставить("ИмяФормы");
	ПараметрыДлительнойОперации.Вставить("ДействиеСНастройками");
	ПараметрыДлительнойОперации.Вставить("ПользовательИнформационнойБазы");
	ПараметрыДлительнойОперации.Вставить("ПользовательСсылка");
	
	ЗаполнитьЗначенияСвойств(ПараметрыДлительнойОперации, ЭтотОбъект);
	
	ПараметрыДлительнойОперации.Вставить("НастройкиОтчетовДерево",
		РеквизитФормыВЗначение("НастройкиОтчетов"));
	
	ПараметрыДлительнойОперации.Вставить("НастройкиВнешнегоВида",
		РеквизитФормыВЗначение("ВнешнийВид"));
	
	ПараметрыДлительнойОперации.Вставить("ПрочиеНастройкиДерево",
		РеквизитФормыВЗначение("ПрочиеНастройки"));
	
	ПараметрыДлительнойОперации.Вставить("ПользовательскиеВариантыОтчетов",
		РеквизитФормыВЗначение("ТаблицаПользовательскихВариантовОтчетов"));
	
	Возврат ПараметрыДлительнойОперации;
	
КонецФункции

#КонецОбласти
